package com.leetcode.leetcode.anyan;

public class _面试题01_06字符串压缩 {

    /**
     * 字符串压缩。利用字符重复出现的次数，编写一种方法，实现基本的字符串压缩功能。比如，字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短，则返回原先的字符串。你可以假设字符串中只包含大小写英文字母（a至z）。
     *
     * 示例1:
     *
     *  输入："aabcccccaaa"
     *  输出："a2b1c5a3"
     * 示例2:
     *
     *  输入："abbccd"
     *  输出："abbccd"
     *  解释："abbccd"压缩后为"a1b2c2d1"，比原字符串长度更长。
     * 提示：
     *
     * 字符串长度在[0, 50000]范围内。
     *
     * 来源：力扣（LeetCode）
     * 链接：https://leetcode-cn.com/problems/compress-string-lcci
     * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
     */

    /**
     * 法一：自己的思路
     * 执行用时：6 ms, 在所有 Java 提交中击败了43.44% 的用户
     * 内存消耗：38.3 MB, 在所有 Java 提交中击败了32.02%的用户
     */
    static class Solution {
        public static String compressString(String s) {
            if (s.length() < 2) return s;
            char c = '0';
            int count = 0;
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < s.length(); i++) {
                char t = s.charAt(i);
                if (c == '0') {
                    count++;
                    c = t;
                    continue;
                }
                if (c == t) {
                    count++;
                } else {
                    sb.append(c);
                    sb.append(count);
                    count = 1;
                    c = t;
                }
                if (i == s.length() - 1) {
                    sb.append(c);
                    sb.append(count);
                }
            }
            return sb.length() >= s.length() ? s : sb.toString();
        }

        public static void main(String[] args) {
            System.out.println(compressString("abbccd"));
        }
    }

    /**
     * 法二：看了Lc的写法
     * 执行用时：5 ms, 在所有 Java 提交中击败了71.40% 的用户
     * 内存消耗：38.3 MB, 在所有 Java 提交中击败了36.12%的用户
     */
    static class Solution2 {
        public static String compressString(String s) {
            if (s.length() < 2) return s;
            int left = 0;
            int right = left + 1;
            StringBuffer sb = new StringBuffer();
            while (right < s.length()) {
                /**
                 * 注意：自己动手敲的时候内存循环没有加right < s.length()，
                 * 导致下标溢出
                 */
                while(right < s.length() && s.charAt(left) == s.charAt(right)) {
                    right++;
                }
                sb.append(s.charAt(left));
                sb.append(right - left);
                left = right;
                /**
                 * 注意：自己动手敲的时候这里又进行了一次 right = left + 1;
                 * 导致最后一种元素只出现一次的话没有和自己进行比较，造成输出结果缺失
                 */
            }
            return sb.length() >= s.length() ? s : sb.toString();
        }

        public static void main(String[] args) {
            System.out.println(compressString("abbccd"));
        }
    }
}
